package core

import (
	"fmt"
	"sync"
)

/*
	一个AOI地图中的格子类型
*/

type Grid struct {
	// 格子的ID
	GID int
	// 格子左边边界坐标
	MinX int
	// 格子右边边界坐标
	MaxX int
	// 格子上边边界坐标
	MinY int
	// 格子下边边界坐标
	MaxY int
	// 当前格子内玩家或者物体成员的ID集合
	playerIDs map[int]bool
	// 当前成员集合的读写保护锁
	PIDLock sync.RWMutex
}

// 初始化当前格子的方法
func NewGrid(gID, minX, maxX, minY, maxY int) *Grid {
	return &Grid{
		GID:       gID,
		MinX:      minX,
		MaxX:      maxX,
		MinY:      minY,
		MaxY:      maxY,
		playerIDs: make(map[int]bool),
	}
}

// 给格子添加一个玩家
func (g *Grid) Add(playerID int) {
	g.PIDLock.Lock()
	defer g.PIDLock.Unlock()
	g.playerIDs[playerID] = true
}

// 从格子中删除一个玩家
func (g *Grid) Remove(playerID int) {
	g.PIDLock.Lock()
	defer g.PIDLock.Unlock()

	delete(g.playerIDs, playerID)
}

// 得到格子中的所有玩家
func (g *Grid) GetPlayerIDs() (playerIDs []int) {
	g.PIDLock.RLock()
	defer g.PIDLock.RUnlock()
	for k := range g.playerIDs {
		playerIDs = append(playerIDs, k)
	}
	return
}

// 调试使用 打印出格子的基本信息
func (g *Grid) String() string {
	return fmt.Sprintf("Grid id：%d,minX:%d, maxX:%d, minY:%d, maxY:%d，playerIds：%v",
		g.GID, g.MinX, g.MaxX, g.MinY, g.MaxY, g.playerIDs)
}
